import 'package:get/get.dart';
import 'package:interview/utils/logger.dart';

/// 用作token过期时 针对 401 状态码  将所有请求暂存 登录后进行重新请求
/// 目前使用了 refresh_provider 进行刷新处理
class AuthController extends GetxController {
  final RxBool isAuthenticated = false.obs;
  final List<Future<void> Function()> pendingRequests = <Future<void> Function()>[];

  void login() async {
    isAuthenticated.value = true;

    // 创建一个新的列表来保存需要重试的请求
    final List<Future<void> Function()> retryRequests = [];

    for (int i = 0; i < pendingRequests.length; i++) {
      Future<void> Function() request = pendingRequests[i];
      try {
        Logger.info("需要重新请求 $request", tag: "AuthController");
        await request.call();
        // 如果请求成功，则不再重试，并从列表中移除
        pendingRequests.removeAt(i);
        i--; // 因为删除了一个元素，所以索引需要减1
      } catch (e) {
        // 如果请求失败，可能是由于其他原因，可以考虑将其加入重试列表
        Logger.error("请求失败 $e", tag: "AuthController");
        retryRequests.add(request);
      }
    }

    // 更新 pendingRequests 为需要重试的请求
    pendingRequests.clear();
    pendingRequests.addAll(retryRequests);
  }

  void logout() {
    isAuthenticated.value = false;
    pendingRequests.clear(); // 清除挂起的请求
  }

  void addPendingRequest(Future<void> Function() request) {
    Logger.info("添加了几次请求" , tag: "addPendingRequest");
    if (!isAuthenticated.value) {
      // 检查是否已经存在相同的请求，避免重复添加
      bool requestExists = pendingRequests.any((r) => r.hashCode == request.hashCode);
      if (!requestExists) {
        pendingRequests.add(request);
      }
    } 
  }
}